﻿using System;
using System.Collections.Specialized;
using System.Linq;

namespace Library.Util
{
    public class Validation
    {
        /// <summary>
        /// Numerik Kontrolü
        /// </summary>
        /// <param name="sayi">Kontrol Edilecek Değer</param>
        /// <param name="ekstraKarakterler">Nokta veya Virgül gibi karakterler isteniyorsa</param>
        /// <returns>Numerik=true|Numerik Değil=false</returns>
        public static bool IsNumeric(string sayi, string ekstraKarakterler)
        {
            string gecerliKarakterler;
            bool isDouble = true;
            gecerliKarakterler = "0123456789" + ekstraKarakterler;

            for (int i = 0; i < sayi.Length && isDouble; i++)
            {
                string karakter = sayi.Substring(i, 1);
                if (gecerliKarakterler.IndexOf(karakter) == -1)
                    isDouble = false;
            }
            return isDouble;
        }

        /// <summary>
        /// Numerik Kontrolü ('.' ve ',' karakterlerini içerebilir.)
        /// </summary>
        /// <param name="sayi">Kontrol Edilecek Değer</param>
        /// <returns>Numerik=true|Numerik Değil=false</returns>
        public static bool IsNumeric(string sayi)
        {
            return IsNumeric(sayi, ".,");
        }

        /// <summary>
        /// T.C. Vatandaşlık numarasının doğru olup olmadığını kontrol eder.
        /// </summary>
        /// <param name="tcKimlikNo">Kontrol edilecek T.C. Vatandaşlık Numarası</param>
        /// <returns>Doğru olup olmadığı</returns>
        public static bool IsTcKimlikNo(string tcKimlikNo)
        {
            if (String.IsNullOrEmpty(tcKimlikNo) || tcKimlikNo.Length != 11)
                return false;
            if (!IsNumeric(tcKimlikNo, ""))
                return false;
            if (tcKimlikNo.StartsWith("0"))
                return false;

            int[] numbers = new int[11];
            for (int i = 0; i < tcKimlikNo.ToCharArray().Length; i++)
                numbers[i] = Convert.ToInt32(tcKimlikNo.Substring(i, 1));

            int algorithm1 = numbers[0] + numbers[2] + numbers[4] + numbers[6] + numbers[8];
            algorithm1 = ((algorithm1 * 7) - (numbers[1] + numbers[3] + numbers[5] + numbers[7])) % 10;
            if (algorithm1 != numbers[9])
                return false;

            int algorithm2 = 0;
            for (int i = 0; i < numbers.Length - 1; i++)
                algorithm2 += numbers[i];
            if (algorithm2 % 10 != numbers[10])
                return false;

            return true;
        }

        /// <summary>
        /// IBAN Numarasının doğru olup olmadığını kontrol eder.
        /// </summary>
        /// <param name="iban">Kontrol edilecek IBAN Numarası</param>
        /// <returns>Doğru olup olmadığı</returns>
        public static bool IsIban(string iban)
        {
            if (String.IsNullOrEmpty(iban))
                return false;
            
            iban = iban.Replace("-", "");
            iban = iban.Replace(" ", "");

            if (iban.Length != 26)
                return false;
            if (iban.Contains("İ") || iban.Contains("Ç") || iban.Contains("Ğ") || iban.Contains("Ö") || iban.Contains("Ş") || iban.Contains("Ü"))
                return false;

            char iban1 = iban.ToCharArray()[0];
            char iban2 = iban.ToCharArray()[1];
            string iban3 = iban.Substring(4);

            if (IsNumeric(iban1.ToString()) || IsNumeric(iban2.ToString()))
                return false;
            if (!IsNumeric(iban3, ""))
                return false;

            NameValueCollection charCodes = new NameValueCollection();
            charCodes.Add("A", "10"); charCodes.Add("B", "11"); charCodes.Add("C", "12"); charCodes.Add("D", "13"); charCodes.Add("E", "14");
            charCodes.Add("F", "15"); charCodes.Add("G", "16"); charCodes.Add("H", "17"); charCodes.Add("I", "18"); charCodes.Add("J", "19");
            charCodes.Add("K", "20"); charCodes.Add("L", "21"); charCodes.Add("M", "22"); charCodes.Add("N", "23"); charCodes.Add("O", "24");
            charCodes.Add("P", "25"); charCodes.Add("Q", "26"); charCodes.Add("R", "27"); charCodes.Add("S", "28"); charCodes.Add("T", "29");
            charCodes.Add("U", "30"); charCodes.Add("V", "31"); charCodes.Add("W", "32"); charCodes.Add("X", "33"); charCodes.Add("Y", "34");
            charCodes.Add("Z", "35");

            iban = iban3 + charCodes[iban1.ToString()] + charCodes[iban2.ToString()] + iban.Substring(2, 2);
            string ibanPart1 = iban.Substring(0, 18);
            string ibanPart2 = iban.Substring(18);
            int ibanParity = Convert.ToInt32(Convert.ToInt64(Convert.ToString(Convert.ToInt64(ibanPart1)%97) + ibanPart2) % 97);
            if (ibanParity == 1)
                return true;
            return false;
        }

        /// <summary>
        /// Dosya uzantısı filtrelemesi
        /// </summary>
        /// <param name="fileName">Dosya Adı</param>
        /// <param name="extensionFilter">Dosya uzantı filtresi '|' karakteri ile ayrılır. Örn: .jpg|.gif</param>
        /// <returns>Dosyanın yüklenip yüklenemeyeceğini döndürür</returns>
        public static bool ExtensionValidation(string fileName, string extensionFilter)
        {
            if (!String.IsNullOrEmpty(extensionFilter) && extensionFilter != "*" && extensionFilter != "*.*")
            {
                string ext = FileUtil.GetFileExtension(fileName);
                string[] extensionFilterList = extensionFilter.Split('|');                
                if (extensionFilterList.Any(t => t.Equals(ext, StringComparison.OrdinalIgnoreCase)))                
                    return true;                
                return false;
            }
            return true;
        }
    }
}